import { ValueOf } from '@/ayaka'

/**
 * 运输任务 memory
 */
export interface TransportMemory {
    /**
     * 搬运工
     */
    transporter: string[]
    /**
     * 运输任务队列
     */
    tasks: AnyTransportTask[]
}

/**
 * 运输任务类型：一对一运输，一对多运输和多对一运输
 */
export type TransportType = 'oneToOne' | 'oneToMore' | 'moreToOne'

/**
 * 一对一运输任务数据
 */
export interface OneToOneTransportData {
    /**
     * 源 id
     */
    sourceId: Id<AnyStoreStructure>
    /**
     * 目标 id
     */
    targetId: Id<AnyStoreStructure>
    /**
     * 资源信息
     */
    resInfo: {
        [type in ResourceConstant]?: {
            /**
             * 需要运输的数量
             */
            require: number
            /**
             * 已经运输的数量
             */
            has: number
        }
    }
}

/**
 * 一对多运输任务数据
 */
export interface OneToMoreTransportData {
    /**
     * 源 id
     */
    sourceId: Id<AnyStoreStructure>
    /**
     * 资源信息
     */
    targetInfo: {
        /**
         * 目标 id
         */
        id: Id<AnyStoreStructure>
        /**
         * 资源类型
         */
        type: ResourceConstant
        /**
         * 需要运输的数量
         */
        require: number
        /**
         * 已经运输的数量
         */
        has: number
    }[]
}

/**
 * 多对一运输任务数据
 */
export interface MoreToOneTransportData {
    /**
     * 目标 id
     */
    targetId: Id<AnyStoreStructure>
    /**
     * 资源信息
     */
    sourceInfo: {
        /**
         * 源 id
         */
        id: Id<AnyStoreStructure>
        /**
         * 资源类型
         */
        type: ResourceConstant
        /**
         * 需要运输的数量
         */
        require: number
        /**
         * 已经运输的数量
         */
        has: number
    }[]
}

/**
 * 运输任务类型到数据的映射
 */
export interface TransportDataMap {
    oneToOne: OneToOneTransportData
    oneToMore: OneToMoreTransportData
    moreToOne: MoreToOneTransportData
}

/**
 * 具体运输任务数据
 */
export type ConcreteTransportData<T extends TransportType> = TransportDataMap[T]

/**
 * 运输任务
 */
export interface TransportTask<T extends TransportType> {
    /**
     * 任务 id
     */
    id: string
    /**
     * 任务名称
     */
    name: string
    /**
     * 任务子名称
     */
    subName?: string
    /**
     * 运输任务类型
     */
    type: T
    /**
     * 运输任务数据
     */
    data: ConcreteTransportData<T>
    /**
     * 任务优先级
     */
    priority: number
    /**
     * 有敌人存在时是否暂停任务
     */
    pauseWhenEnemy?: boolean
}

/**
 * 任何运输任务
 */
export type AnyTransportTask = ValueOf<{ [type in TransportType]: TransportTask<type> }>

declare global {
    interface RoomMemory {
        transport: TransportMemory
    }
}
